use core::{
Dependency,
PackageId,
- Summary,
Registry,
SourceId,
};
}
}
-/*
-pub fn resolve<R: Registry>(deps: &[Dependency], registry: &mut R) -> CargoResult<Vec<PackageId>> {
- Ok(try!(resolve2(deps, registry)).iter().map(|p| p.clone()).collect())
-}
-*/
-
struct Context<'a, R> {
registry: &'a mut R,
resolve: Resolve,
}
}
-pub fn resolve<R: Registry>(deps: &[Dependency], registry: &mut R) -> CargoResult<Resolve> {
+pub fn resolve<R: Registry>(root: &PackageId, deps: &[Dependency], registry: &mut R)
+ -> CargoResult<Resolve>
+{
log!(5, "resolve; deps={}", deps);
let mut context = Context::new(registry);
- try!(resolve_deps(None, deps, &mut context));
+ try!(resolve_deps(root, deps, &mut context));
Ok(context.resolve)
}
-fn resolve_deps<'a, R: Registry>(parent: Option<&PackageId>,
+fn resolve_deps<'a, R: Registry>(parent: &PackageId,
deps: &[Dependency],
ctx: &mut Context<'a, R>)
-> CargoResult<()>
let source_id = summary.get_source_id().clone();
let version = summary.get_version().clone();
+ ctx.resolve.graph.link(parent.clone(), summary.get_package_id().clone());
+
let found = {
let found = ctx.seen.find(&(name.clone(), source_id.clone()));
.map(|d| d.clone())
.collect();
- try!(resolve_deps(Some(summary.get_package_id()), deps.as_slice(), ctx));
-
- parent.map(|parent| {
- ctx.resolve.graph.link(parent.clone(), summary.get_package_id().clone());
- });
+ try!(resolve_deps(summary.get_package_id(), deps.as_slice(), ctx));
}
Ok(())
use core::source::{SourceId, RegistryKind, Location, Remote};
use core::{Dependency, PackageId, Summary, Registry};
- use super::resolve;
use util::CargoResult;
- fn resolve<R: Registry>(deps: &[Dependency], registry: &mut R) -> CargoResult<Vec<PackageId>> {
- Ok(try!(super::resolve(deps, registry)).iter().map(|p| p.clone()).collect())
+ fn resolve<R: Registry>(pkg: &PackageId, deps: &[Dependency], registry: &mut R)
+ -> CargoResult<Vec<PackageId>>
+ {
+ Ok(try!(super::resolve(pkg, deps, registry)).iter().map(|p| p.clone()).collect())
}
trait ToDep {
}
fn pkg(name: &str) -> Summary {
- Summary::new(&PackageId::new(name, "1.0.0", ®istry_loc()).unwrap(),
- &[])
+ Summary::new(&pkg_id(name), &[])
+ }
+
+ fn pkg_id(name: &str) -> PackageId {
+ PackageId::new(name, "1.0.0", ®istry_loc()).unwrap()
}
fn dep(name: &str) -> Dependency {
#[test]
pub fn test_resolving_empty_dependency_list() {
- let res = resolve([], &mut registry(vec!())).unwrap();
+ let res = resolve(&pkg_id("root"), [], &mut registry(vec!())).unwrap();
assert_that(&res, equal_to(&names([])));
}
#[test]
pub fn test_resolving_only_package() {
let mut reg = registry(vec!(pkg("foo")));
- let res = resolve([dep("foo")], &mut reg);
+ let res = resolve(&pkg_id("root"), [dep("foo")], &mut reg);
- assert_that(&res.unwrap(), equal_to(&names(["foo"])));
+ assert_that(&res.unwrap(), contains(names(["root", "foo"])).exactly());
}
#[test]
pub fn test_resolving_one_dep() {
let mut reg = registry(vec!(pkg("foo"), pkg("bar")));
- let res = resolve([dep("foo")], &mut reg);
+ let res = resolve(&pkg_id("root"), [dep("foo")], &mut reg);
- assert_that(&res.unwrap(), equal_to(&names(["foo"])));
+ assert_that(&res.unwrap(), contains(names(["root", "foo"])).exactly());
}
#[test]
pub fn test_resolving_multiple_deps() {
let mut reg = registry(vec!(pkg!("foo"), pkg!("bar"), pkg!("baz")));
- let res = resolve([dep("foo"), dep("baz")], &mut reg).unwrap();
+ let res = resolve(&pkg_id("root"), [dep("foo"), dep("baz")], &mut reg).unwrap();
- assert_that(&res, contains(names(["foo", "baz"])).exactly());
+ assert_that(&res, contains(names(["root", "foo", "baz"])).exactly());
}
#[test]
pub fn test_resolving_transitive_deps() {
let mut reg = registry(vec!(pkg!("foo"), pkg!("bar" => "foo")));
- let res = resolve([dep("bar")], &mut reg).unwrap();
+ let res = resolve(&pkg_id("root"), [dep("bar")], &mut reg).unwrap();
- assert_that(&res, contains(names(["foo", "bar"])));
+ assert_that(&res, contains(names(["root", "foo", "bar"])));
}
#[test]
pub fn test_resolving_common_transitive_deps() {
let mut reg = registry(vec!(pkg!("foo" => "bar"), pkg!("bar")));
- let res = resolve([dep("foo"), dep("bar")], &mut reg).unwrap();
+ let res = resolve(&pkg_id("root"), [dep("foo"), dep("bar")], &mut reg).unwrap();
- assert_that(&res, contains(names(["foo", "bar"])));
+ assert_that(&res, contains(names(["root", "foo", "bar"])));
}
#[test]
pkg!("bat")
));
- let res = resolve([dep("foo"), dep("baz").as_dev()], &mut reg).unwrap();
+ let res = resolve(&pkg_id("root"), [dep("foo"), dep("baz").as_dev()], &mut reg).unwrap();
- assert_that(&res, contains(names(["foo", "bar", "baz"])));
+ assert_that(&res, contains(names(["root", "foo", "bar", "baz"])));
}
}
use std::io;
use std::os::args;
use std::str;
+use std::io::TempDir;
use term::color::YELLOW;
use core::{Package, PackageSet, Target, Resolve};
use util;
-use util::{CargoResult, ChainError, ProcessBuilder, internal, human, CargoError};
+use util::{CargoResult, ChainError, ProcessBuilder, CargoError, Require, internal, human};
use util::{Config, TaskPool, DependencyQueue, Fresh, Dirty, Freshness};
type Args = Vec<String>;
rustc_version: &'a str,
resolve: &'a Resolve,
package_set: &'a PackageSet,
- config: &'b mut Config<'b>
+ config: &'b mut Config<'b>,
+ dylib: (String, String)
}
type Job = proc():Send -> CargoResult<()>;
internal(format!("Couldn't create the directory for dependencies for {} at {}",
pkg.get_name(), deps_target_dir.display()))));
+ let temp: TempDir = try!(TempDir::new_in(&deps_target_dir, "temp")
+ .require(|| internal("Couldn't create a tempdir")));
+
+ let file = temp.path().join("dylib.rs");
+ try!(File::create(&file));
+
+ let output = try!(util::process("rustc")
+ .arg(file.display().to_str())
+ .arg("--crate-name").arg("-")
+ .arg("--crate-type").arg("dylib")
+ .arg("--print-file-name")
+ .exec_with_output());
+
+ let output = str::from_utf8(output.output.as_slice()).unwrap();
+
+ let parts: Vec<&str> = output.slice_to(output.len() - 1).split('-').collect();
+ assert!(parts.len() == 2, "rustc --print-file-name output has changed");
+
let mut cx = Context {
dest: &deps_target_dir,
deps_dir: &deps_target_dir,
rustc_version: rustc_version.as_slice(),
resolve: resolve,
package_set: deps,
- config: config
+ config: config,
+ dylib: (parts.get(0).to_str(), parts.get(1).to_str())
};
// Build up a list of pending jobs, each of which represent compiling a
// everything in order with proper parallelism.
let mut jobs = Vec::new();
for dep in deps.iter() {
+ if dep == pkg { continue; }
+
// Only compile lib targets for dependencies
let targets = dep.get_targets().iter().filter(|target| {
target.is_lib() && target.get_profile().get_env() == env
proc() {
if primary {
+ log!(5, "executing primary");
rustc.exec().map_err(|err| human(err.to_str()))
} else {
+ log!(5, "executing deps");
rustc.exec_with_output().and(Ok(())).map_err(|err| {
human(err.to_str())
})
for target in dep_targets(package, cx).iter() {
dst.push("--extern".to_str());
- dst.push(format!("{}={}/lib{}.rlib",
+ dst.push(format!("{}={}/{}",
target.get_name(),
cx.deps_dir.display(),
- target.file_stem()));
+ target_filename(target, cx)));
+ }
+}
+
+fn target_filename(target: &Target, cx: &Context) -> String {
+ let stem = target.file_stem();
+
+ if target.is_dylib() {
+ let (ref prefix, ref suffix) = cx.dylib;
+ format!("{}{}{}", prefix, stem, suffix)
+ } else if target.is_rlib() {
+ format!("lib{}.rlib", stem)
+ } else {
+ unreachable!()
}
}